import { _decorator, Node, Animation } from 'cc'
import { ANIMATION_GRAPH_TYPE_ENUM, ENTITY_STATE_ENUM } from '../enums'
import { StateMachine } from '../base/StateMachine'
import IdleSubStateMachine from './IdleSubStateMachine'
import DeadSubStateMachine from './DeadSubStateMachine'
import { BACK_DEATH_ANIMATION_WHITE_LIST } from '../utils/constants'
import { EntityMgr } from '../base/EntityMgr'
const { ccclass, property } = _decorator
/** 移动烟雾状态机 */
@ccclass('SmokeStateMachine')
export class SmokeStateMachine extends StateMachine {
  async init() {
    this.animationComponent = this.addComponent(Animation)
    this.initParams()
    this.initStateMachines()
    this.initAnimationEvent()
    await Promise.all(this.watingState)
  }

  /** 初始化参数列表 */
  initParams() {
    // 移动的4个方向 保存的是数值0~3(上下左右)，没有对应的状态机，这是用来给其他状态机选择对应的方向使用的
    this.params.set(ENTITY_STATE_ENUM.DIRECTION, { type: ANIMATION_GRAPH_TYPE_ENUM.NUMBER, value: 0 })

    this.params.set(ENTITY_STATE_ENUM.IDLE, { type: ANIMATION_GRAPH_TYPE_ENUM.TRIGGER, value: false })
    this.params.set(ENTITY_STATE_ENUM.DEATH, { type: ANIMATION_GRAPH_TYPE_ENUM.TRIGGER, value: false })
  }

  /** 初始化状态机 */
  initStateMachines() {
    this.stateMachines.set(ENTITY_STATE_ENUM.IDLE, new IdleSubStateMachine(this))
    this.stateMachines.set(ENTITY_STATE_ENUM.DEATH, new DeadSubStateMachine(this))
  }

  /** 动画播放完毕的处理 比如恢复成其他动画 */
  initAnimationEvent() {
    this.animationComponent.on(Animation.EventType.FINISHED, () => {
      const aniName = this.animationComponent.defaultClip.name
      // 当前动画是烟雾idle状态时切换回死亡状态
      if (BACK_DEATH_ANIMATION_WHITE_LIST.includes(aniName)) {
        this.node.getComponent(EntityMgr).state = ENTITY_STATE_ENUM.DEATH // 通过统一的控制入口来设置状态
        // this.setParams(ENTITY_STATE_ENUM.IDLE, true) // 这个其实也行，但是上面那个更符合设计思维
      }
    })
  }

  /** 运行状态机 切换当前状态 */
  run() {
    switch (this.currentState) {
      case this.stateMachines.get(ENTITY_STATE_ENUM.IDLE):
      case this.stateMachines.get(ENTITY_STATE_ENUM.DEATH):
        // 判断触发器trigger是否为true,为true表示切换到对应的状态
        if (this.params.get(ENTITY_STATE_ENUM.IDLE)?.value) {
          this.currentState = this.stateMachines.get(ENTITY_STATE_ENUM.IDLE)
        } else if (this.params.get(ENTITY_STATE_ENUM.DEATH)?.value) {
          this.currentState = this.stateMachines.get(ENTITY_STATE_ENUM.DEATH)
        } else {
          this.currentState = this.currentState // 触发StateMachine基类的set currentState方法
        }
        break
      default:
        this.currentState = this.stateMachines.get(ENTITY_STATE_ENUM.IDLE)
        break
    }
  }
}
